{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2026-06-05T03:30:26.607825Z",
     "start_time": "2025-06-05T03:30:26.519315Z"
    }
   },
   "source": [
    "# import libraries\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "# 对pandas和matplotlib 的显示设置\n",
    "pd.set_option('display.max_columns', 30)\n",
    "plt.rcParams.update({\"font.family\":\"SimHei\",\"font.size\":14})\n",
    "plt.style.use(\"tableau-colorblind10\")\n",
    "\n",
    "\n",
    "# # matplotlib支持中文\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号\n",
    "%matplotlib inline"
   ],
   "outputs": [],
   "execution_count": 1
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:30:26.618143Z",
     "start_time": "2025-06-05T03:30:26.610353Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")"
   ],
   "id": "3002c5eaa212cb79",
   "outputs": [],
   "execution_count": 2
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "1. 数据清洗",
   "id": "8246337c518aeddf"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:31:08.262663Z",
     "start_time": "2025-06-05T03:30:26.618143Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#数据加载 大数据-用户画像-10-用户复购预测\n",
    "data_test = pd.read_csv(\"E:/练习/用户复购预测/用户复购率预测/用户复购预测数据/data_format1/test_format1.csv\")\n",
    "data_train = pd.read_csv(\"E:/练习/用户复购预测/用户复购率预测/用户复购预测数据/data_format1/train_format1.csv\")\n",
    "data_user_info = pd.read_csv(\"E:/练习/用户复购预测/用户复购率预测/用户复购预测数据/data_format1/user_info_format1.csv\")\n",
    "data_user_log = pd.read_csv(\"E:/练习/用户复购预测/用户复购率预测/用户复购预测数据/data_format1/user_log_format1.csv\")"
   ],
   "id": "76d73bfdb77eaf68",
   "outputs": [],
   "execution_count": 3
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:07.312420Z",
     "start_time": "2025-06-05T03:31:08.264669Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#压缩内存：调整数据类型，将原来int64调整为合适的大小，例如:int32、int16、int8，以达到压缩内存的目的。\n",
    "# 二次导入数据时，指定数据类型以压缩内存\n",
    "d_types = {'user_id': 'int32', 'item_id': 'int32', 'cat_id': 'int16', 'seller_id': 'int16', 'brand_id': 'float32', 'time_stamp': 'int16', 'action_type': 'int8'}\n",
    "data_user_log = pd.read_csv(\"E:/练习/用户复购预测/用户复购率预测/用户复购预测数据/data_format1/user_log_format1.csv\",dtype = d_types)\n",
    "# check tables\n",
    "display(data_user_log.head(1))\n",
    "display(data_user_info.head(1))\n",
    "display(data_train.head(1))\n",
    "display(data_test.head(1))"
   ],
   "id": "4d03e18ceee3761",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  item_id  cat_id  seller_id  brand_id  time_stamp  action_type\n",
       "0   328862   323294     833       2882    2661.0         829            0"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>cat_id</th>\n",
       "      <th>seller_id</th>\n",
       "      <th>brand_id</th>\n",
       "      <th>time_stamp</th>\n",
       "      <th>action_type</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>328862</td>\n",
       "      <td>323294</td>\n",
       "      <td>833</td>\n",
       "      <td>2882</td>\n",
       "      <td>2661.0</td>\n",
       "      <td>829</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "   user_id  age_range  gender\n",
       "0   376517        6.0     1.0"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>age_range</th>\n",
       "      <th>gender</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>376517</td>\n",
       "      <td>6.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label\n",
       "0    34176         3906      0"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  prob\n",
       "0   163968         4605   NaN"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>prob</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>163968</td>\n",
       "      <td>4605</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "1.1 数据类型检查",
   "id": "dd293afc4f2cdae5"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:07.378198Z",
     "start_time": "2025-06-05T03:32:07.312420Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#数据类型检查\n",
    "display(data_user_log.info())\n",
    "display(data_user_info.info())\n",
    "display(data_train.info())\n",
    "display(data_test.info())"
   ],
   "id": "7881ae6c4ee4bfb9",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 54925330 entries, 0 to 54925329\n",
      "Data columns (total 7 columns):\n",
      " #   Column       Dtype  \n",
      "---  ------       -----  \n",
      " 0   user_id      int32  \n",
      " 1   item_id      int32  \n",
      " 2   cat_id       int16  \n",
      " 3   seller_id    int16  \n",
      " 4   brand_id     float32\n",
      " 5   time_stamp   int16  \n",
      " 6   action_type  int8   \n",
      "dtypes: float32(1), int16(3), int32(2), int8(1)\n",
      "memory usage: 995.2 MB\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "None"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 424170 entries, 0 to 424169\n",
      "Data columns (total 3 columns):\n",
      " #   Column     Non-Null Count   Dtype  \n",
      "---  ------     --------------   -----  \n",
      " 0   user_id    424170 non-null  int64  \n",
      " 1   age_range  421953 non-null  float64\n",
      " 2   gender     417734 non-null  float64\n",
      "dtypes: float64(2), int64(1)\n",
      "memory usage: 9.7 MB\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "None"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 260864 entries, 0 to 260863\n",
      "Data columns (total 3 columns):\n",
      " #   Column       Non-Null Count   Dtype\n",
      "---  ------       --------------   -----\n",
      " 0   user_id      260864 non-null  int64\n",
      " 1   merchant_id  260864 non-null  int64\n",
      " 2   label        260864 non-null  int64\n",
      "dtypes: int64(3)\n",
      "memory usage: 6.0 MB\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "None"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 261477 entries, 0 to 261476\n",
      "Data columns (total 3 columns):\n",
      " #   Column       Non-Null Count   Dtype  \n",
      "---  ------       --------------   -----  \n",
      " 0   user_id      261477 non-null  int64  \n",
      " 1   merchant_id  261477 non-null  int64  \n",
      " 2   prob         0 non-null       float64\n",
      "dtypes: float64(1), int64(2)\n",
      "memory usage: 6.0 MB\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "None"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 5
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "训练集和测试集都有约26万条数据。",
   "id": "7fe3dd4b2d5ab9b8"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "1.2 压缩数据",
   "id": "9abf6f7c9fc2c53d"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:07.478627Z",
     "start_time": "2025-06-05T03:32:07.380722Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 拼接train、test数据，方便下一步提取特征\n",
    "data_train[\"origin\"] = \"train\"\n",
    "data_test[\"origin\"] = \"test\"\n",
    "data = pd.concat([data_train,data_test],sort = False)\n",
    "data = data.drop([\"prob\"],axis = 1)\n",
    "data.info()"
   ],
   "id": "31315fce290aa1e6",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Index: 522341 entries, 0 to 261476\n",
      "Data columns (total 4 columns):\n",
      " #   Column       Non-Null Count   Dtype  \n",
      "---  ------       --------------   -----  \n",
      " 0   user_id      522341 non-null  int64  \n",
      " 1   merchant_id  522341 non-null  int64  \n",
      " 2   label        260864 non-null  float64\n",
      " 3   origin       522341 non-null  object \n",
      "dtypes: float64(1), int64(2), object(1)\n",
      "memory usage: 19.9+ MB\n"
     ]
    }
   ],
   "execution_count": 6
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:07.491302Z",
     "start_time": "2025-06-05T03:32:07.478627Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 所有列都是数值型，直接downcast(降级)\n",
    "# 初次压缩时，对所有数据集进行压缩\n",
    "list = [data,data_user_log,data_user_info]"
   ],
   "id": "4061147376988f1f",
   "outputs": [],
   "execution_count": 7
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:20.379145Z",
     "start_time": "2025-06-05T03:32:07.492503Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 二次导入时无需重复data_user_log压缩\n",
    "#list = [data,data_user_info]\n",
    "\n",
    "for df in list:\n",
    "    fcols = df.select_dtypes('float').columns\n",
    "    icols = df.select_dtypes('integer').columns\n",
    "    df[fcols] = df[fcols].apply(pd.to_numeric, downcast='float')\n",
    "    df[icols] = df[icols].apply(pd.to_numeric, downcast='integer')\n",
    "# check table info again\n",
    "display(data_user_log.info())\n",
    "display(data_user_info.info())\n",
    "display(data.info())"
   ],
   "id": "ceb476cc8368f2e2",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 54925330 entries, 0 to 54925329\n",
      "Data columns (total 7 columns):\n",
      " #   Column       Dtype  \n",
      "---  ------       -----  \n",
      " 0   user_id      int32  \n",
      " 1   item_id      int32  \n",
      " 2   cat_id       int16  \n",
      " 3   seller_id    int16  \n",
      " 4   brand_id     float32\n",
      " 5   time_stamp   int16  \n",
      " 6   action_type  int8   \n",
      "dtypes: float32(1), int16(3), int32(2), int8(1)\n",
      "memory usage: 995.2 MB\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "None"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 424170 entries, 0 to 424169\n",
      "Data columns (total 3 columns):\n",
      " #   Column     Non-Null Count   Dtype  \n",
      "---  ------     --------------   -----  \n",
      " 0   user_id    424170 non-null  int32  \n",
      " 1   age_range  421953 non-null  float32\n",
      " 2   gender     417734 non-null  float32\n",
      "dtypes: float32(2), int32(1)\n",
      "memory usage: 4.9 MB\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "None"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Index: 522341 entries, 0 to 261476\n",
      "Data columns (total 4 columns):\n",
      " #   Column       Non-Null Count   Dtype  \n",
      "---  ------       --------------   -----  \n",
      " 0   user_id      522341 non-null  int32  \n",
      " 1   merchant_id  522341 non-null  int16  \n",
      " 2   label        260864 non-null  float32\n",
      " 3   origin       522341 non-null  object \n",
      "dtypes: float32(1), int16(1), int32(1), object(1)\n",
      "memory usage: 13.0+ MB\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "None"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:20.395368Z",
     "start_time": "2025-06-05T03:32:20.379145Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 记录数据类型，二次导入时用\n",
    "d_col = data_user_log.dtypes.index\n",
    "d_type = [i.name for i in data_user_log.dtypes.values]\n",
    "column_dict = dict(zip(d_col,d_type))\n",
    "print(column_dict)\n",
    "{'user_id': 'int32', 'item_id': 'int32', 'cat_id': 'int16', 'seller_id': 'int16', 'brand_id': 'float32', 'time_stamp': 'int16', 'action_type': 'int8'}\n",
    "# 统一字段名\n",
    "data_user_log.rename(columns = {\"seller_id\":\"merchant_id\"},inplace = True)"
   ],
   "id": "d6e466173980acf0",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'user_id': 'int32', 'item_id': 'int32', 'cat_id': 'int16', 'seller_id': 'int16', 'brand_id': 'float32', 'time_stamp': 'int16', 'action_type': 'int8'}\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "1.3 空值处理",
   "id": "c01fe0577ff5908c"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:20.425410Z",
     "start_time": "2025-06-05T03:32:20.396888Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 年龄、性别列存在null值，填补空值\n",
    "data_user_info[\"age_range\"].fillna(0,inplace = True)  # 0和null代表未知\n",
    "data_user_info[\"gender\"].fillna(0,inplace = True)  # 2和null代表未知\n",
    "data_user_info.info()"
   ],
   "id": "1b8002f0baef6e0f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 424170 entries, 0 to 424169\n",
      "Data columns (total 3 columns):\n",
      " #   Column     Non-Null Count   Dtype  \n",
      "---  ------     --------------   -----  \n",
      " 0   user_id    424170 non-null  int32  \n",
      " 1   age_range  424170 non-null  float32\n",
      " 2   gender     424170 non-null  float32\n",
      "dtypes: float32(2), int32(1)\n",
      "memory usage: 4.9 MB\n"
     ]
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:21.306100Z",
     "start_time": "2025-06-05T03:32:20.425410Z"
    }
   },
   "cell_type": "code",
   "source": "data_user_log.isna().sum()",
   "id": "93057659b7a00f21",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "user_id            0\n",
       "item_id            0\n",
       "cat_id             0\n",
       "merchant_id        0\n",
       "brand_id       91015\n",
       "time_stamp         0\n",
       "action_type        0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:21.552751Z",
     "start_time": "2025-06-05T03:32:21.306100Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# brand_id列有较多空值，以0填充\n",
    "data_user_log[\"brand_id\"].fillna(0, inplace = True)"
   ],
   "id": "b3700312ab7f0570",
   "outputs": [],
   "execution_count": 12
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "1.4 数据初步探索",
   "id": "f4ffa2e1ebd5db68"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:22.380646Z",
     "start_time": "2025-06-05T03:32:21.552751Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 计算年龄分布\n",
    "tags = data_user_info.age_range.value_counts().sort_index()\n",
    "# 创建DataFrame时避免列名冲突\n",
    "age_df = pd.DataFrame({\n",
    "    'age_code': tags.index,  # 使用不同的列名\n",
    "    'count': tags.values     # 使用不同的列名\n",
    "})\n",
    "# 设置画布\n",
    "plt.figure(figsize=(10, 6))\n",
    "ax = sns.barplot(x='age_code', y='count', data=age_df, palette=\"Blues\")\n",
    "\n",
    "# 自定义标签和标题\n",
    "ax.set_title('用户年龄分布', fontsize=14)\n",
    "ax.set_xlabel('年龄区间', fontsize=12)\n",
    "ax.set_ylabel('用户数量', fontsize=12)\n",
    "\n",
    "# 设置刻度标签\n",
    "age_labels = {\n",
    "    1: \"0-18岁\",\n",
    "    2: \"19-24岁\",\n",
    "    3: \"25-29岁\",\n",
    "    4: \"30-34岁\",\n",
    "    5: \"35-39岁\",\n",
    "    6: \"40-49岁\",\n",
    "    7: \"50岁以上\",\n",
    "    8: \"未知\",\n",
    "    0: \"未知\"  # 添加0对应的标签\n",
    "}\n",
    "# 设置X轴标签为可读的年龄区间\n",
    "ax.set_xticklabels([age_labels.get(i, \"未知\") for i in age_df['age_code']], rotation=45)\n",
    "\n",
    "# 在柱子上方显示数值\n",
    "for p in ax.patches:\n",
    "    ax.annotate(f'{int(p.get_height()):,}', \n",
    "                (p.get_x() + p.get_width() / 2., p.get_height()),\n",
    "                ha='center', va='center', \n",
    "                xytext=(0, 5), \n",
    "                textcoords='offset points',\n",
    "                fontsize=9)\n",
    "# 调整布局\n",
    "plt.show()"
   ],
   "id": "fee1f69e5a3a70a",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ],
      "image/png": "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EipdurQqVaokLy8vp7rvv/9e8+bN0wMPPKAnn3wyxzoMAAAAAEh3S4FOkvbv36/IyEhduHBBMTExKl26tB599FE9++yzSk5O1ksvvaQnn3wyV8JcdHS0OnbsqLJly+qTTz5xuqn5jh07tHDhQp04cUJly5bVuHHj1KhRI6ft7Xa7lixZonXr1unChQuqX7++pkyZojJlymR6nrlz52rnzp1KTExUhw4dNH78+EyTvYSGhmr27Nk6cOCAPDw8NGDAAPXr1y/H9xsAAAAArnZLs1xaLBYtXLjQMbtlbGysfvnlF3311Vfq0qWLXF1d1blzZ02ZMiUn++owdepUxcbG6q233nIKc5s3b9bIkSNVuXJljRw5Uvv27dPgwYO1fv16+fv7O22/Zs0aNW/eXH369NGGDRvUv39/bdy4UR4eHpLS77E3YMAA/fHHH3ruuedUokQJLV26VHFxcZo3b56jrRMnTqhXr16yWCwaNGiQLl26pLfffltubm7q2bNnruw/AAAAAEjZDHRXrlxR79691bJlSz322GOS5BSkrly5or///lu///67ihUrpkKFCik2NlZW6y3PuXJNW7du1ebNm/Xqq6+qQoUKjuUJCQmaNm2aSpUqpTVr1sjT01N9+vRRnz59NGPGDAUFBUmSDh48qDVr1qht27YKDAyUxWJRp06d1Lp1ay1dulQjRoyQJK1cuVKHDx/WpEmT1KtXL0lSjRo11LdvXz377LOqX7++JGnWrFmKj49XcHCwqlWrJin9dg1z5szRU0895QiIAAAAAJDTspW4YmJiVK1aNX399dd65plnZBiGxo8frxdffFGtWrVS69atFRISoueff147d+7UmjVr9Pvvv+u9997L0c5GRkZqypQp8vf318CBA53W/fzzz4qKilKvXr3k6ekpKT10BgQEaM+ePYqKipIkbdmyRZI0ZMgQRygtUqSI2rVrp5CQEEd7W7ZsUZEiRdSjRw/HsoYNG8rPz89Rd/nyZe3evVtNmzZ1hDlJ6tmzp+Lj47V79+4c3X8AAAAAuFq2At0DDzygqVOnav369fr66681fvx4JSUladeuXYqLi3McAevWrZvy5cunIkWKaPbs2fr4448VFhaWY5194403FB0drWeeeUY7d+7Ub7/95lgXGhoqSWrQoIHTNtWrV5fdbteRI0ccdQULFnQKYFL60bfjx48r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FRYWdsf7bmYZr1U3Nze9/PLLKleunI4dO6Y1a9aodu3akv4Z60uXLqlXr17au3evjh07lpfdvutk9frN8MMPPyhfvnxas2aNHn74YRmG4RhTq9WqHTt2qFGjRvrtt9+UkpJyp7t+V2NccwfjmjsY17xTvHhx9evXT4MHD9aKFSv06quvasmSJfL19dXSpUtVuHBhx+eKrERHRys+Pl4Wi+WemBXzfvkMS6DDDXl5ealLly4KCwvTd999p9GjR+vAgQPy8fHRn3/+KUlKSUmRh4eH/Pz89OCDD2ratGnasmWLXFxcdPr0aXXo0EEdO3bU4sWL9ddff+nXX39VQkJC3u7YXSrjmqy1a9cqMjJSNptNaWlpeu+99zRv3jy98MIL2rdvn06fPq3IyEgNGTJEkvTZZ59JkipWrKikpCSdPHkyz/bBjDImQJGkDz/8UCdPntSyZctUs2ZNSel/FIYMGSKLxaINGzaoc+fOiomJcVwLgnQZr9/NmzfrwoULjgl85syZo0WLFqlv3746efKkLl686BhTKf3mwpL04IMP6sKFC46JE5COcc0djGvuYFzzVtGiRdW3b1+98MILOnTokOLj4/X222+rUKFCstvt1wxzUVFRev/99xUQEKDLly/fE7fouV8+w5r/J4VclfEtW48ePeTn56chQ4bI09NTb7/9tv78808FBgbq2LFj+umnnzR+/HhZLBYNGDBAZcqU0fTp07V69Wp1795dLVq00OTJk9W4cWOtX79erVu3loeHRx7v3d0rNDRU8+fP13PPPaf4+HgtXrxYK1as0MqVK+Xm5qa33npL0dHRGj58uKR/wpwkFSxYUJKY7TKbVq5cqY8//lhS+gQob7/9tj788EP16NFDGzdu1MaNG52OgmaMdf78+SXJcYTu399I389++uknTZs2TVOnTlVkZKQWLVqkoKAgffbZZ3J1ddXYsWMVHx+vF198URaLxen16+vrK0l8M58FxjV3MK65g3HNW8WKFdOzzz6rYcOGKT4+Xl988YXOnTt3zZAWFRWlNWvW6PPPP1fp0qXl6el5h3uc8+6nz7Aued0B3N0yvmUrVqyYmjZtqmPHjmnSpEkqV66cLl68qCVLlighIUFhYWEqVaqU3nzzTUnpb8IffPCBZsyYoYceekizZs2SlH74mvvM3Jifn59GjhypwMBA1a1bVy4uLgoK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jRs3qFChAvv372fz5s106dKFokWLYmNjQ7t27WjWrJm+319BoT0l+umnn+jTp48ej+PHj3Po0CE+++wzunbtSrFixTh48CAXL17E3d2d4cOH4+/vz65duzh//jzJyck5TqMqqHfjtYHatm3bGDVqFDVq1ODVV1/lxx9/5MqVK4SEhFCmTBk9/jVr1uT7778HYNq0aaxevZo5c+aQlpbGyJEjyczMZNasWfrNC4lr9rheunSJpUuX0r17d1xcXDhw4ID016dkNBpxcHDA29ubTZs2MX36dJKTk2nSpAm9e/emVKlSch34g1JTU4mPj8fV1VWfIWJvb4+DgwPFixfXz9P6ur+/P3Xr1mXVqlXs2LGDtLQ0bG1t9W1PXF1dmTp1qj6DR7um5Hcyhs3Bn1ZuRby0UlJS1Geffab++c9/Wh3fvn27ql27tvLy8lLt2rVTTZo0UZ06dVIXL15USil19+5dFRUVpZKTk/Oi2flemzZtlJeXl5o+ffojz5k2bZry8fFRZ8+e1Y99++23qmrVqqp27drq0qVLL6Kp+dapU6eUj4+PCgoKUh988IHq06ePqlSpklq4cKFSKqsqlsViUadPn1a+vr7q+vXravbs2crb21t9/fXXSimlevfurby8vNS1a9eUUlJpLTIyUjVo0ED169dP/fzzzyouLk7t3LlTVa1aVY0bN87q3PT0dKuKad9//73y8vKyquIqsty6dUv5+vqqGTNm6H0sPDxceXl5qRUrVlidu3XrVlW7dm01duxYVblyZbV+/XqVkpKilMqqMPjDDz+84Na/vB4X16VLl1qdm5aWJv31KWjxDAkJUV5eXqp169aqbdu2avfu3VbnyXXg2WRmZqp///vf6p133lHHjh174vlms1kppdRnn32mvLy81NChQ9WIESPUkCFDVL9+/VTr1q1Vnz59slUTze9kDJszSegKqMuXL1v9fefOncrf319t27ZNTZo0SbVs2VLt379f1a9fX7Vt21ZduHAh28BWu5iI3OnTp49q0KCBev3119XEiROtfqbF9vr16yooKEi9+eabavLkyWrcuHGqWrVqysvLS+3bty8vmp1vJCQkqG7duqmOHTvqie+9e/fU8OHDVc2aNdWNGzf0c9PS0lT9+vVVs2bNVOXKldWGDRustoc4ffr0C2//y+rQoUOqSpUq6rvvvtOPJSUlqdGj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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 13
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:22.541447Z",
     "start_time": "2025-06-05T03:32:22.382390Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 用户性别分布\n",
    "sizes = data_user_info.gender.value_counts().sort_index()\n",
    "\n",
    "labels = ['女性', '男性', '未知']\n",
    "colors = ['lightcoral', 'lightskyblue',  'yellowgreen']\n",
    "explode = (0.1, 0, 0)\n",
    "\n",
    "patches,l_text,p_text = plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90)\n",
    "plt.axis('equal')\n",
    "for t in l_text:\n",
    "    t.set_size(14)\n",
    "for t in p_text:\n",
    "    t.set_size(10)\n",
    "plt.show()"
   ],
   "id": "b216db217197df11",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:23.273104Z",
     "start_time": "2025-06-05T03:32:22.541447Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 用户操作类型分布\n",
    "sizes = data_user_log.action_type.value_counts().sort_index()\n",
    "# tags.plot.bar()\n",
    "labels = ['单击', '购物车', '购买', '收藏夹']  # 定义标签\n",
    "colors = ['lightskyblue', 'yellowgreen', 'gold', 'lightcoral']  # 每一块的颜色\n",
    "explode = (0.1, 0, 0, 0)  # 突出显示，这里仅仅突出显示第二块（即'Hogs'）\n",
    "\n",
    "patches,l_text,p_text = plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90)\n",
    "plt.axis('equal')  # 显示为圆（避免比例压缩为椭圆）\n",
    "for t in l_text:\n",
    "    t.set_size(14)\n",
    "for t in p_text:\n",
    "    t.set_size(10)\n",
    "plt.show()"
   ],
   "id": "bf35187aee63823a",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGLCAYAAABa0JF/AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdIBJREFUeJzt3Xd8HPWd//HXzPZd9d5lW+62JNvgQu/N9BISCBykkeTCcWnkApdKuEviJJeQ/HJJCCEJOQiY3sGAMRhswL1bLuq9r7R9d2Z+f6wtvEjuknYlfZ6PBw+smZ3Z70o7O+/9VsUwDAMhhBBCTFhqvAsghBBCiPiSMCCEEEJMcBIGhBBCiAlOwoAQQggxwUkYEEIIISY4CQNCCCHEBCdhQAghhJjgJAwIIYQQE5yEASHEmLF161Y++OCDmG0+n4+HHnqI/fv3H/f5vvvd7/LEE08M/NzQ0MB1113Hrl27TriMwWCQs88+m9///vcnfA4hRps53gUQQohj9fDDD9Pc3Mzy5csHtq1Zs4Zf/OIX1NfXc9999w15nGEY7Nu3j5SUFBwOx8D2HTt2kJGRQV9fHwAej4cdO3YQCoUGthmGgd/vR9M0CgsLj1pGm81GW1sbNpvtZF6qEKNKwoAQYsxwOBxYrdaYbW+88QZOp5O77rrrsMeFQiGuuOKKIfft2bOHv/zlLzHbbrzxxkGPu+SSS/jtb38bc04Ai8WCoigxjzWZTIO26bpOKBQiFAqRkpJy2LIKEQ8SBoQQCeuee+5h69atvPzyywCoqhpzk+3t7eXVV19l8eLFbNu2LebYSCRCKBQiPz+f+fPns3LlSlJTU0lKShp4zBVXXMEll1zCv/3bvwHQ1NTERRddxAsvvMDUqVPp6uriRz/6EV/72tfIzs6OOf8//vEPli1bdtiyL1u2bMj9JpOJnTt3Hv8vQ4gRJGFACJGwgsEgmqYddv9TTz1FMBjk/fff5/333wei1fq6rg885tprr2XBggVkZWUN+rb+ve99j9zc3IGfCwsL2blzJ7feeiuXXHIJn/70p/H7/bz00kvceeedMcdeeeWVnHHGGVRXVzN9+vSYc19++eXccccdXH311QPbampqsNvtUisgEpKEASFEwrJarYOaBQ7y+/08/PDD3HjjjfzkJz8Z2P70009z77338sEHH+B0Oge2//u//zuTJk3izjvv5JRTTjnqc3/00UcD5129ejUA3/72twf25+Tk0Nrayt133813v/tdbr31ViDafGAYBnl5eZSVlQ08/ve//z0rV66M6e8gRKKQMCCESGif/DZ/0D/+8Q+6urpISkpi165dzJo1C4COjg6sVitpaWkxxzocDux2O3a7HYAf/vCHh+1HcM8992C32/nhD39IJBIhGAzGdDw8qLy8nHnz5vE///M/XHzxxeTm5g70JTg0xLS0tLBixQouv/xypk+ffmK/CCFGkIQBIcSY09LSwh/+8Ac+9alP8fjjj2MymQbCQFNTE0VFRUN24Ovr66Ourg4Ap9PJSy+9xObNmzGZTAOPKy8vp6ioiOrqalJSUujr6yM1NTXmMQcpisJ3vvMdbrzxRn7xi1/wy1/+csgw8MADD6CqKt/85jeH/XchxHCQeQaEEGPOpk2bsNvtfP3rX2fx4sV8+OGHA/uqqqqG/PYdDAZ59NFHWbp06cC2HTt2sH37dsLhMM888wzt7e0A5Ofn09LSAsAzzzzDBRdcQGNj45Blqays5LTTTkPTNDRNGwgDB4cW7tixg2effZabb745pn+CEIlEagaEEGPO0qVLOe+883A4HJx99tncd999tLe3k5yczO7du7nssssGHfPHP/5x4N8zZsxAVVVsNhunnXYa//7v/86LL77IF77wBebNm8eaNWuor69H0zR27tyJpmkUFBQMHL9//37WrVs3MKzwoosuwuFw8Pzzz9Pd3Q3A+vXr8Xq9AJxyyink5OTw9NNPEwqF0DSNW265ZYR/S0IcOwkDQoiEdeioAIgOFzzoYBv+BRdcwH333cfLL79MaWkpwWCQc845J+a4V155herqamw2G6oarRA1mUyYTCYeeeQR/u///g+Az33uc5x55pn88Ic/JBgMUlNTw/r167nkkksGjoPot/2f//znQ84xcLBm4JFHHsHpdA40FxycIfHgfgkDIpFIGBBCJKRQKMS2bdvo6uri1ltvpaqqCrfbzaJFi2Iel5uby+mnn87jjz9OSUkJs2fPZsqUKTGPaW9v5/3336eqqoqLLroIALM5+vH3+c9/nv/4j/8A4He/+x2bN2+mpKSEtLQ0/va3v9HU1MSVV14Zc76rrrqKq666ashy33///bz22mssWLAAt9vN3/72t8N2ghQiUUifASFEQurt7aW9vR1FUSgqKuLHP/7xkNX/ADfccAO1tbW8++673HzzzYP233777SxdupTCwsKBG//BYYcPP/wwM2bMYMaMGfy///f/Bo4544wzePLJJ5k5cyaVlZXHVObW1laefvpprrzySr71rW+xZcsW/vznPx/vSxdi1EkYEEIkpJycHB577DFWr17NT3/6Uy677DJcLteQjz1YE6CqKmedddaQj9m9ezclJSU0NzcDkJ2djWEY3HLLLaxbtw6Av/71r/zud78DYObMmQDccccdx1Rej8fDXXfdhcvl4itf+QqlpaV897vf5Te/+Q0vvfTSsb9wIeJAwoAQImHNmDHjsJMOHbR3716+9KUvkZycjNPp5Ktf/SqdnZ0xjwmFQqxatYqFCxdSVVWFyWRi0qRJ6LpOIBCgp6cHgL6+PjweD01NTTz00EMA7Nq1i0gkwubNmw9bht27d/PZz36WxsZG/va3v5GamgrAZz7zGT772c9y991385e//AXDME7ityHEyJEwIIQYMz55M33++ee58cYbCYfDPPzww/zhD3+gtraWq6++mmeeeWagw+Gjjz6K2+3msssu491332XmzJnY7Xb8fj9PPfUUF198MRCdpfDOO+/ky1/+MsnJydx444088sgjvPfee9x0003s2bMn5vl9Ph+//vWvueGGG3C73TzyyCNMnTo15jH33nsvN998M8uWLeNLX/oS9fX1I/gbEuLEKIZEVSHEGPGd73yHhoYGvv71r/P73/+eDz/8kLlz5/Kb3/yG4uJiAHbu3MnXv/516urqyMrK4q677iIpKYn9+/dz0003cdFFF/HFL35xYK0BwzAG1jP4v//7P37961+Tn5/PX/7yFzIyMrj++uvZv38/NpuNjz76CLvdTlVVFU8++SQvvPACfX19XHPNNdxzzz0DNQJDOXRhoyuvvJJ77703ZtEkIeJJRhMIIcaMQCBAIBCgo6ODbdu28ZWvfIU777wTi8Uy8JjZs2fz4osv8sgjj/D6669z5ZVXDnQWfPLJJ9F1neuvv37g8YqioCgKqqqSlpbGGWecwbJlywZu1A8++CBf//rXmT179sBUxgBPPPEEF1xwAV/+8pcHZj88kltvvZVFixbxox/9CJfLJUFAJBSpGRBCjEkej+eEbqhut/uI3+CPVX9/P8nJySd0bCQSGRjaKEQikDAghBBCTHDSgVAIIYSY4CQMCCGEEBOchAEh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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 15
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "2. 构建特征",
   "id": "5ef961dd3c999d85"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "2.1 用户特征",
   "id": "d9e2444e6ef3c582"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:23.281527Z",
     "start_time": "2025-06-05T03:32:23.274849Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 按user_id分组\n",
    "#groups = data_user_log.groupby([\"user_id\"])\n",
    "# 统计交互总次数\n",
    "#temp = groups.size().reset_index().rename(columns = {0:\"u1\"})\n",
    "#data = pd.merge(data,temp, on =\"user_id\",how = \"left\")\n",
    "#data.head(3)\n"
   ],
   "id": "88c2692b9053215e",
   "outputs": [],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:25.814598Z",
     "start_time": "2025-06-05T03:32:23.281527Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 确保所有ID列使用一致的数据类型（int64）\n",
    "for col in ['user_id', 'merchant_id']:\n",
    "    if col in data.columns:\n",
    "        data[col] = data[col].astype('int64')\n",
    "    if col in data_user_log.columns:\n",
    "        data_user_log[col] = data_user_log[col].astype('int64')\n",
    "\n",
    "# 按user_id分组\n",
    "groups = data_user_log.groupby([\"user_id\"])\n",
    "\n",
    "# 统计交互总次数\n",
    "temp = groups.size().reset_index().rename(columns={0: \"u1\"})\n",
    "\n",
    "# 确保temp的user_id类型与data一致\n",
    "temp['user_id'] = temp['user_id'].astype('int64')\n",
    "\n",
    "# 执行合并\n",
    "data = pd.merge(data, temp, on=\"user_id\", how=\"left\")\n",
    "\n",
    "# 查看结果\n",
    "data.head(3)"
   ],
   "id": "d8c75089b531dee4",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label origin   u1\n",
       "0    34176         3906    0.0  train  451\n",
       "1    34176          121    0.0  train  451\n",
       "2    34176         4356    1.0  train  451"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>origin</th>\n",
       "      <th>u1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:32:30.896801Z",
     "start_time": "2025-06-05T03:32:25.814598Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计交互天数\n",
    "temp = groups.time_stamp.nunique().reset_index().rename(columns = {\"time_stamp\":\"u2\"})\n",
    "data = data.merge(temp,on =\"user_id\",how = \"left\")\n",
    "data.head(3)"
   ],
   "id": "c2ba4a01637d56a8",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label origin   u1  u2\n",
       "0    34176         3906    0.0  train  451  47\n",
       "1    34176          121    0.0  train  451  47\n",
       "2    34176         4356    1.0  train  451  47"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>origin</th>\n",
       "      <th>u1</th>\n",
       "      <th>u2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 18
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:33:07.845482Z",
     "start_time": "2025-06-05T03:32:30.896801Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计交互过的商品、品类、品牌、商家数\n",
    "temp = groups[['item_id','cat_id','merchant_id','brand_id']].nunique().reset_index().rename(columns={\n",
    "    'item_id':'u3','cat_id':'u4','merchant_id':'u5','brand_id':'u6'})\n",
    "data = data.merge(temp,on =\"user_id\",how = \"left\")\n",
    "data.head(3)"
   ],
   "id": "a82fb6d70ad1859d",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label origin   u1  u2   u3  u4   u5   u6\n",
       "0    34176         3906    0.0  train  451  47  256  45  109  108\n",
       "1    34176          121    0.0  train  451  47  256  45  109  108\n",
       "2    34176         4356    1.0  train  451  47  256  45  109  108"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>origin</th>\n",
       "      <th>u1</th>\n",
       "      <th>u2</th>\n",
       "      <th>u3</th>\n",
       "      <th>u4</th>\n",
       "      <th>u5</th>\n",
       "      <th>u6</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 19
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:33:13.109372Z",
     "start_time": "2025-06-05T03:33:07.845482Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计点击、加购物车、购买、收藏的操作次数\n",
    "temp = groups['action_type'].value_counts().unstack().reset_index().rename(columns={0:'u7', 1:'u8', 2:'u9', 3:'u10'})\n",
    "data = data.merge(temp,on =\"user_id\",how = \"left\")\n",
    "data.head(3)"
   ],
   "id": "a4167aea5c5fb037",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label origin   u1  u2   u3  u4   u5   u6     u7  u8  \\\n",
       "0    34176         3906    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "1    34176          121    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "2    34176         4356    1.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "\n",
       "     u9  u10  \n",
       "0  34.0  7.0  \n",
       "1  34.0  7.0  \n",
       "2  34.0  7.0  "
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>origin</th>\n",
       "      <th>u1</th>\n",
       "      <th>u2</th>\n",
       "      <th>u3</th>\n",
       "      <th>u4</th>\n",
       "      <th>u5</th>\n",
       "      <th>u6</th>\n",
       "      <th>u7</th>\n",
       "      <th>u8</th>\n",
       "      <th>u9</th>\n",
       "      <th>u10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 20
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:33:17.967773Z",
     "start_time": "2025-06-05T03:33:13.110878Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计购买点击比\n",
    "data[\"u11\"] = data[\"u9\"]/data[\"u7\"]\n",
    "# 复购率 = 复购过的商家数/购买过的总商家数\n",
    "# 按user_id,merchant_id分组，购买天数>1则复购标记为1，反之为0\n",
    "groups_rb = data_user_log[data_user_log[\"action_type\"]==2].groupby([\"user_id\",\"merchant_id\"])\n",
    "temp_rb = groups_rb.time_stamp.nunique().reset_index().rename(columns = {\"time_stamp\":\"n_days\"})\n",
    "temp_rb[\"label_um\"] = [(1 if x > 1 else 0) for x in temp_rb[\"n_days\"]]\n",
    "\n",
    "# 与data进行匹配\n",
    "temp = temp_rb.groupby([\"user_id\",\"label_um\"]).size().unstack(fill_value=0).reset_index()\n",
    "temp[\"u12\"] = temp[1]/(temp[0]+temp[1])\n",
    "\n",
    "data = data.merge(temp[[\"user_id\",\"u12\"]],on =\"user_id\",how = \"left\")\n",
    "data.head(3)"
   ],
   "id": "f3360b387496ce01",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label origin   u1  u2   u3  u4   u5   u6     u7  u8  \\\n",
       "0    34176         3906    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "1    34176          121    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "2    34176         4356    1.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "\n",
       "     u9  u10       u11       u12  \n",
       "0  34.0  7.0  0.082927  0.045455  \n",
       "1  34.0  7.0  0.082927  0.045455  \n",
       "2  34.0  7.0  0.082927  0.045455  "
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>origin</th>\n",
       "      <th>u1</th>\n",
       "      <th>u2</th>\n",
       "      <th>u3</th>\n",
       "      <th>u4</th>\n",
       "      <th>u5</th>\n",
       "      <th>u6</th>\n",
       "      <th>u7</th>\n",
       "      <th>u8</th>\n",
       "      <th>u9</th>\n",
       "      <th>u10</th>\n",
       "      <th>u11</th>\n",
       "      <th>u12</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>0.045455</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>0.045455</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>0.045455</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:33:18.363378Z",
     "start_time": "2025-06-05T03:33:17.973222Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 性别、年龄独热编码处理\n",
    "data = data.merge(data_user_info,on =\"user_id\",how = \"left\")\n",
    "\n",
    "temp = pd.get_dummies(data[\"age_range\"],prefix = \"age\")\n",
    "temp2 = pd.get_dummies(data[\"gender\"],prefix = \"gender\")\n",
    "\n",
    "data = pd.concat([data,temp,temp2],axis = 1)\n",
    "data.drop(columns = [\"age_range\",\"gender\"],inplace = True)\n",
    "data.head(3)"
   ],
   "id": "2a0a102a7d8bdb3e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label origin   u1  u2   u3  u4   u5   u6     u7  u8  \\\n",
       "0    34176         3906    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "1    34176          121    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "2    34176         4356    1.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "\n",
       "     u9  u10       u11       u12  age_0.0  age_1.0  age_2.0  age_3.0  age_4.0  \\\n",
       "0  34.0  7.0  0.082927  0.045455    False    False    False    False    False   \n",
       "1  34.0  7.0  0.082927  0.045455    False    False    False    False    False   \n",
       "2  34.0  7.0  0.082927  0.045455    False    False    False    False    False   \n",
       "\n",
       "   age_5.0  age_6.0  age_7.0  age_8.0  gender_0.0  gender_1.0  gender_2.0  \n",
       "0    False     True    False    False        True       False       False  \n",
       "1    False     True    False    False        True       False       False  \n",
       "2    False     True    False    False        True       False       False  "
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>origin</th>\n",
       "      <th>u1</th>\n",
       "      <th>u2</th>\n",
       "      <th>u3</th>\n",
       "      <th>u4</th>\n",
       "      <th>u5</th>\n",
       "      <th>u6</th>\n",
       "      <th>u7</th>\n",
       "      <th>u8</th>\n",
       "      <th>u9</th>\n",
       "      <th>u10</th>\n",
       "      <th>u11</th>\n",
       "      <th>u12</th>\n",
       "      <th>age_0.0</th>\n",
       "      <th>age_1.0</th>\n",
       "      <th>age_2.0</th>\n",
       "      <th>age_3.0</th>\n",
       "      <th>age_4.0</th>\n",
       "      <th>age_5.0</th>\n",
       "      <th>age_6.0</th>\n",
       "      <th>age_7.0</th>\n",
       "      <th>age_8.0</th>\n",
       "      <th>gender_0.0</th>\n",
       "      <th>gender_1.0</th>\n",
       "      <th>gender_2.0</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>0.045455</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>0.045455</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>0.045455</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 22
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:33:18.370318Z",
     "start_time": "2025-06-05T03:33:18.363378Z"
    }
   },
   "cell_type": "code",
   "source": "",
   "id": "c2359fdd0ca71c54",
   "outputs": [],
   "execution_count": 22
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "2.2 商家特征",
   "id": "f3f73157cb408645"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:33:43.039357Z",
     "start_time": "2025-06-05T03:33:18.372394Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 按merchant_id分组\n",
    "groups = data_user_log.groupby([\"merchant_id\"])\n",
    "# 统计交互总次数\n",
    "temp = groups.size().reset_index().rename(columns = {0:\"m1\"})\n",
    "data = pd.merge(data,temp, on =\"merchant_id\",how = \"left\")\n",
    "data.head(3)\n",
    "# 统计交互天数\n",
    "temp = groups.time_stamp.nunique().reset_index().rename(columns = {\"time_stamp\":\"m2\"})\n",
    "data = data.merge(temp,on =\"merchant_id\",how = \"left\")\n",
    "data.head(3)\n",
    "# 统计交互过的商品、品类、品牌、用户数\n",
    "temp = groups[['item_id','cat_id','user_id','brand_id']].nunique().reset_index().rename(columns={\n",
    "    'item_id':'m3','cat_id':'m4','user_id':'m5','brand_id':'m6'})\n",
    "data = data.merge(temp,on =\"merchant_id\",how = \"left\")\n",
    "data.head(3)"
   ],
   "id": "f42130b0a7335e72",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label origin   u1  u2   u3  u4   u5   u6     u7  u8  \\\n",
       "0    34176         3906    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "1    34176          121    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "2    34176         4356    1.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "\n",
       "     u9  u10       u11  ...  age_3.0  age_4.0  age_5.0  age_6.0  age_7.0  \\\n",
       "0  34.0  7.0  0.082927  ...    False    False    False     True    False   \n",
       "1  34.0  7.0  0.082927  ...    False    False    False     True    False   \n",
       "2  34.0  7.0  0.082927  ...    False    False    False     True    False   \n",
       "\n",
       "   age_8.0  gender_0.0  gender_1.0  gender_2.0     m1   m2    m3  m4     m5  \\\n",
       "0    False        True       False       False  16269  185   308  20   5819   \n",
       "1    False        True       False       False  79865  185  1179  26  10931   \n",
       "2    False        True       False       False   7269  155    67  15   2281   \n",
       "\n",
       "   m6  \n",
       "0   2  \n",
       "1   2  \n",
       "2   2  \n",
       "\n",
       "[3 rows x 34 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>origin</th>\n",
       "      <th>u1</th>\n",
       "      <th>u2</th>\n",
       "      <th>u3</th>\n",
       "      <th>u4</th>\n",
       "      <th>u5</th>\n",
       "      <th>u6</th>\n",
       "      <th>u7</th>\n",
       "      <th>u8</th>\n",
       "      <th>u9</th>\n",
       "      <th>u10</th>\n",
       "      <th>u11</th>\n",
       "      <th>...</th>\n",
       "      <th>age_3.0</th>\n",
       "      <th>age_4.0</th>\n",
       "      <th>age_5.0</th>\n",
       "      <th>age_6.0</th>\n",
       "      <th>age_7.0</th>\n",
       "      <th>age_8.0</th>\n",
       "      <th>gender_0.0</th>\n",
       "      <th>gender_1.0</th>\n",
       "      <th>gender_2.0</th>\n",
       "      <th>m1</th>\n",
       "      <th>m2</th>\n",
       "      <th>m3</th>\n",
       "      <th>m4</th>\n",
       "      <th>m5</th>\n",
       "      <th>m6</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>16269</td>\n",
       "      <td>185</td>\n",
       "      <td>308</td>\n",
       "      <td>20</td>\n",
       "      <td>5819</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>79865</td>\n",
       "      <td>185</td>\n",
       "      <td>1179</td>\n",
       "      <td>26</td>\n",
       "      <td>10931</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>7269</td>\n",
       "      <td>155</td>\n",
       "      <td>67</td>\n",
       "      <td>15</td>\n",
       "      <td>2281</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 34 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 23
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:33:47.186932Z",
     "start_time": "2025-06-05T03:33:43.039357Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计点击、加购物车、购买、收藏的操作次数\n",
    "temp = groups['action_type'].value_counts().unstack().reset_index().rename(columns={0:'m7', 1:'m8', 2:'m9', 3:'m10'})\n",
    "data = data.merge(temp,on =\"merchant_id\",how = \"left\")\n",
    "data.head(3)"
   ],
   "id": "36ecca55aace6d35",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label origin   u1  u2   u3  u4   u5   u6     u7  u8  \\\n",
       "0    34176         3906    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "1    34176          121    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "2    34176         4356    1.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "\n",
       "     u9  u10       u11  ...  age_7.0  age_8.0  gender_0.0  gender_1.0  \\\n",
       "0  34.0  7.0  0.082927  ...    False    False        True       False   \n",
       "1  34.0  7.0  0.082927  ...    False    False        True       False   \n",
       "2  34.0  7.0  0.082927  ...    False    False        True       False   \n",
       "\n",
       "   gender_2.0     m1   m2    m3  m4     m5  m6       m7     m8      m9     m10  \n",
       "0       False  16269  185   308  20   5819   2  14870.0   28.0   410.0   961.0  \n",
       "1       False  79865  185  1179  26  10931   2  72265.0  121.0  4780.0  2699.0  \n",
       "2       False   7269  155    67  15   2281   2   6094.0   16.0   963.0   196.0  \n",
       "\n",
       "[3 rows x 38 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>origin</th>\n",
       "      <th>u1</th>\n",
       "      <th>u2</th>\n",
       "      <th>u3</th>\n",
       "      <th>u4</th>\n",
       "      <th>u5</th>\n",
       "      <th>u6</th>\n",
       "      <th>u7</th>\n",
       "      <th>u8</th>\n",
       "      <th>u9</th>\n",
       "      <th>u10</th>\n",
       "      <th>u11</th>\n",
       "      <th>...</th>\n",
       "      <th>age_7.0</th>\n",
       "      <th>age_8.0</th>\n",
       "      <th>gender_0.0</th>\n",
       "      <th>gender_1.0</th>\n",
       "      <th>gender_2.0</th>\n",
       "      <th>m1</th>\n",
       "      <th>m2</th>\n",
       "      <th>m3</th>\n",
       "      <th>m4</th>\n",
       "      <th>m5</th>\n",
       "      <th>m6</th>\n",
       "      <th>m7</th>\n",
       "      <th>m8</th>\n",
       "      <th>m9</th>\n",
       "      <th>m10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>16269</td>\n",
       "      <td>185</td>\n",
       "      <td>308</td>\n",
       "      <td>20</td>\n",
       "      <td>5819</td>\n",
       "      <td>2</td>\n",
       "      <td>14870.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>410.0</td>\n",
       "      <td>961.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>79865</td>\n",
       "      <td>185</td>\n",
       "      <td>1179</td>\n",
       "      <td>26</td>\n",
       "      <td>10931</td>\n",
       "      <td>2</td>\n",
       "      <td>72265.0</td>\n",
       "      <td>121.0</td>\n",
       "      <td>4780.0</td>\n",
       "      <td>2699.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>7269</td>\n",
       "      <td>155</td>\n",
       "      <td>67</td>\n",
       "      <td>15</td>\n",
       "      <td>2281</td>\n",
       "      <td>2</td>\n",
       "      <td>6094.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>963.0</td>\n",
       "      <td>196.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 38 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 24
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:33:47.672300Z",
     "start_time": "2025-06-05T03:33:47.186932Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计购买点击比\n",
    "data[\"m11\"] = data[\"m9\"]/data[\"m7\"]\n",
    "# 复购率 = 复购过的用户数/购买过的总用户数\n",
    "# 按user_id,merchant_id分组，购买天数>1则复购标记为1，反之为0（在上一步已计算）\n",
    "# 与data进行匹配\n",
    "temp = temp_rb.groupby([\"merchant_id\",\"label_um\"]).size().unstack(fill_value=0).reset_index()\n",
    "temp[\"m12\"] = temp[1]/(temp[0]+temp[1])\n",
    "\n",
    "data = data.merge(temp[[\"merchant_id\",\"m12\"]],on =\"merchant_id\",how = \"left\")\n",
    "data.head(3)"
   ],
   "id": "3593076790b6ad9e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label origin   u1  u2   u3  u4   u5   u6     u7  u8  \\\n",
       "0    34176         3906    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "1    34176          121    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "2    34176         4356    1.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "\n",
       "     u9  u10       u11  ...  gender_0.0  gender_1.0  gender_2.0     m1   m2  \\\n",
       "0  34.0  7.0  0.082927  ...        True       False       False  16269  185   \n",
       "1  34.0  7.0  0.082927  ...        True       False       False  79865  185   \n",
       "2  34.0  7.0  0.082927  ...        True       False       False   7269  155   \n",
       "\n",
       "     m3  m4     m5  m6       m7     m8      m9     m10       m11       m12  \n",
       "0   308  20   5819   2  14870.0   28.0   410.0   961.0  0.027572  0.048387  \n",
       "1  1179  26  10931   2  72265.0  121.0  4780.0  2699.0  0.066145  0.053014  \n",
       "2    67  15   2281   2   6094.0   16.0   963.0   196.0  0.158024  0.084444  \n",
       "\n",
       "[3 rows x 40 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>origin</th>\n",
       "      <th>u1</th>\n",
       "      <th>u2</th>\n",
       "      <th>u3</th>\n",
       "      <th>u4</th>\n",
       "      <th>u5</th>\n",
       "      <th>u6</th>\n",
       "      <th>u7</th>\n",
       "      <th>u8</th>\n",
       "      <th>u9</th>\n",
       "      <th>u10</th>\n",
       "      <th>u11</th>\n",
       "      <th>...</th>\n",
       "      <th>gender_0.0</th>\n",
       "      <th>gender_1.0</th>\n",
       "      <th>gender_2.0</th>\n",
       "      <th>m1</th>\n",
       "      <th>m2</th>\n",
       "      <th>m3</th>\n",
       "      <th>m4</th>\n",
       "      <th>m5</th>\n",
       "      <th>m6</th>\n",
       "      <th>m7</th>\n",
       "      <th>m8</th>\n",
       "      <th>m9</th>\n",
       "      <th>m10</th>\n",
       "      <th>m11</th>\n",
       "      <th>m12</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>16269</td>\n",
       "      <td>185</td>\n",
       "      <td>308</td>\n",
       "      <td>20</td>\n",
       "      <td>5819</td>\n",
       "      <td>2</td>\n",
       "      <td>14870.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>410.0</td>\n",
       "      <td>961.0</td>\n",
       "      <td>0.027572</td>\n",
       "      <td>0.048387</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>79865</td>\n",
       "      <td>185</td>\n",
       "      <td>1179</td>\n",
       "      <td>26</td>\n",
       "      <td>10931</td>\n",
       "      <td>2</td>\n",
       "      <td>72265.0</td>\n",
       "      <td>121.0</td>\n",
       "      <td>4780.0</td>\n",
       "      <td>2699.0</td>\n",
       "      <td>0.066145</td>\n",
       "      <td>0.053014</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>7269</td>\n",
       "      <td>155</td>\n",
       "      <td>67</td>\n",
       "      <td>15</td>\n",
       "      <td>2281</td>\n",
       "      <td>2</td>\n",
       "      <td>6094.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>963.0</td>\n",
       "      <td>196.0</td>\n",
       "      <td>0.158024</td>\n",
       "      <td>0.084444</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 40 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 25
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:33:47.680711Z",
     "start_time": "2025-06-05T03:33:47.675314Z"
    }
   },
   "cell_type": "code",
   "source": "",
   "id": "bee7817069afb18c",
   "outputs": [],
   "execution_count": 25
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "2.3 用户-商家特征",
   "id": "fc618f5b6a42e9d7"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:34:08.651050Z",
     "start_time": "2025-06-05T03:33:47.682716Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 按user_id,merchant_id分组\n",
    "groups = data_user_log.groupby(['user_id','merchant_id'])\n",
    "# 统计交互总次数\n",
    "temp = groups.size().reset_index().rename(columns = {0:\"um1\"})\n",
    "data = pd.merge(data,temp, on =[\"merchant_id\",\"user_id\"],how = \"left\")\n",
    "data.head(3)"
   ],
   "id": "45648a62babcaf55",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label origin   u1  u2   u3  u4   u5   u6     u7  u8  \\\n",
       "0    34176         3906    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "1    34176          121    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "2    34176         4356    1.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "\n",
       "     u9  u10       u11  ...  gender_1.0  gender_2.0     m1   m2    m3  m4  \\\n",
       "0  34.0  7.0  0.082927  ...       False       False  16269  185   308  20   \n",
       "1  34.0  7.0  0.082927  ...       False       False  79865  185  1179  26   \n",
       "2  34.0  7.0  0.082927  ...       False       False   7269  155    67  15   \n",
       "\n",
       "      m5  m6       m7     m8      m9     m10       m11       m12  um1  \n",
       "0   5819   2  14870.0   28.0   410.0   961.0  0.027572  0.048387   39  \n",
       "1  10931   2  72265.0  121.0  4780.0  2699.0  0.066145  0.053014   14  \n",
       "2   2281   2   6094.0   16.0   963.0   196.0  0.158024  0.084444   18  \n",
       "\n",
       "[3 rows x 41 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>origin</th>\n",
       "      <th>u1</th>\n",
       "      <th>u2</th>\n",
       "      <th>u3</th>\n",
       "      <th>u4</th>\n",
       "      <th>u5</th>\n",
       "      <th>u6</th>\n",
       "      <th>u7</th>\n",
       "      <th>u8</th>\n",
       "      <th>u9</th>\n",
       "      <th>u10</th>\n",
       "      <th>u11</th>\n",
       "      <th>...</th>\n",
       "      <th>gender_1.0</th>\n",
       "      <th>gender_2.0</th>\n",
       "      <th>m1</th>\n",
       "      <th>m2</th>\n",
       "      <th>m3</th>\n",
       "      <th>m4</th>\n",
       "      <th>m5</th>\n",
       "      <th>m6</th>\n",
       "      <th>m7</th>\n",
       "      <th>m8</th>\n",
       "      <th>m9</th>\n",
       "      <th>m10</th>\n",
       "      <th>m11</th>\n",
       "      <th>m12</th>\n",
       "      <th>um1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>16269</td>\n",
       "      <td>185</td>\n",
       "      <td>308</td>\n",
       "      <td>20</td>\n",
       "      <td>5819</td>\n",
       "      <td>2</td>\n",
       "      <td>14870.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>410.0</td>\n",
       "      <td>961.0</td>\n",
       "      <td>0.027572</td>\n",
       "      <td>0.048387</td>\n",
       "      <td>39</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>79865</td>\n",
       "      <td>185</td>\n",
       "      <td>1179</td>\n",
       "      <td>26</td>\n",
       "      <td>10931</td>\n",
       "      <td>2</td>\n",
       "      <td>72265.0</td>\n",
       "      <td>121.0</td>\n",
       "      <td>4780.0</td>\n",
       "      <td>2699.0</td>\n",
       "      <td>0.066145</td>\n",
       "      <td>0.053014</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>7269</td>\n",
       "      <td>155</td>\n",
       "      <td>67</td>\n",
       "      <td>15</td>\n",
       "      <td>2281</td>\n",
       "      <td>2</td>\n",
       "      <td>6094.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>963.0</td>\n",
       "      <td>196.0</td>\n",
       "      <td>0.158024</td>\n",
       "      <td>0.084444</td>\n",
       "      <td>18</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 41 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 26
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:34:24.276928Z",
     "start_time": "2025-06-05T03:34:08.653305Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计交互天数\n",
    "temp = groups.time_stamp.nunique().reset_index().rename(columns = {\"time_stamp\":\"um2\"})\n",
    "data = data.merge(temp,on =[\"merchant_id\",\"user_id\"],how = \"left\")\n",
    "data.head(3)"
   ],
   "id": "ad38aa8b45f9ad26",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label origin   u1  u2   u3  u4   u5   u6     u7  u8  \\\n",
       "0    34176         3906    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "1    34176          121    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "2    34176         4356    1.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "\n",
       "     u9  u10       u11  ...  gender_2.0     m1   m2    m3  m4     m5  m6  \\\n",
       "0  34.0  7.0  0.082927  ...       False  16269  185   308  20   5819   2   \n",
       "1  34.0  7.0  0.082927  ...       False  79865  185  1179  26  10931   2   \n",
       "2  34.0  7.0  0.082927  ...       False   7269  155    67  15   2281   2   \n",
       "\n",
       "        m7     m8      m9     m10       m11       m12  um1  um2  \n",
       "0  14870.0   28.0   410.0   961.0  0.027572  0.048387   39    9  \n",
       "1  72265.0  121.0  4780.0  2699.0  0.066145  0.053014   14    3  \n",
       "2   6094.0   16.0   963.0   196.0  0.158024  0.084444   18    2  \n",
       "\n",
       "[3 rows x 42 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>origin</th>\n",
       "      <th>u1</th>\n",
       "      <th>u2</th>\n",
       "      <th>u3</th>\n",
       "      <th>u4</th>\n",
       "      <th>u5</th>\n",
       "      <th>u6</th>\n",
       "      <th>u7</th>\n",
       "      <th>u8</th>\n",
       "      <th>u9</th>\n",
       "      <th>u10</th>\n",
       "      <th>u11</th>\n",
       "      <th>...</th>\n",
       "      <th>gender_2.0</th>\n",
       "      <th>m1</th>\n",
       "      <th>m2</th>\n",
       "      <th>m3</th>\n",
       "      <th>m4</th>\n",
       "      <th>m5</th>\n",
       "      <th>m6</th>\n",
       "      <th>m7</th>\n",
       "      <th>m8</th>\n",
       "      <th>m9</th>\n",
       "      <th>m10</th>\n",
       "      <th>m11</th>\n",
       "      <th>m12</th>\n",
       "      <th>um1</th>\n",
       "      <th>um2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>16269</td>\n",
       "      <td>185</td>\n",
       "      <td>308</td>\n",
       "      <td>20</td>\n",
       "      <td>5819</td>\n",
       "      <td>2</td>\n",
       "      <td>14870.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>410.0</td>\n",
       "      <td>961.0</td>\n",
       "      <td>0.027572</td>\n",
       "      <td>0.048387</td>\n",
       "      <td>39</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>79865</td>\n",
       "      <td>185</td>\n",
       "      <td>1179</td>\n",
       "      <td>26</td>\n",
       "      <td>10931</td>\n",
       "      <td>2</td>\n",
       "      <td>72265.0</td>\n",
       "      <td>121.0</td>\n",
       "      <td>4780.0</td>\n",
       "      <td>2699.0</td>\n",
       "      <td>0.066145</td>\n",
       "      <td>0.053014</td>\n",
       "      <td>14</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>False</td>\n",
       "      <td>7269</td>\n",
       "      <td>155</td>\n",
       "      <td>67</td>\n",
       "      <td>15</td>\n",
       "      <td>2281</td>\n",
       "      <td>2</td>\n",
       "      <td>6094.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>963.0</td>\n",
       "      <td>196.0</td>\n",
       "      <td>0.158024</td>\n",
       "      <td>0.084444</td>\n",
       "      <td>18</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 42 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 27
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:35:03.864905Z",
     "start_time": "2025-06-05T03:34:24.276928Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计交互过的商品、品类、品牌数\n",
    "temp = groups[['item_id','cat_id','brand_id']].nunique().reset_index().rename(columns={\n",
    "    'item_id':'um3','cat_id':'um4','brand_id':'um5'})\n",
    "data = data.merge(temp,on =[\"merchant_id\",\"user_id\"],how = \"left\")\n",
    "data.head(3)"
   ],
   "id": "e38256aa982e070",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label origin   u1  u2   u3  u4   u5   u6     u7  u8  \\\n",
       "0    34176         3906    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "1    34176          121    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "2    34176         4356    1.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "\n",
       "     u9  u10       u11  ...    m3  m4     m5  m6       m7     m8      m9  \\\n",
       "0  34.0  7.0  0.082927  ...   308  20   5819   2  14870.0   28.0   410.0   \n",
       "1  34.0  7.0  0.082927  ...  1179  26  10931   2  72265.0  121.0  4780.0   \n",
       "2  34.0  7.0  0.082927  ...    67  15   2281   2   6094.0   16.0   963.0   \n",
       "\n",
       "      m10       m11       m12  um1  um2  um3  um4  um5  \n",
       "0   961.0  0.027572  0.048387   39    9   20    6    1  \n",
       "1  2699.0  0.066145  0.053014   14    3    1    1    1  \n",
       "2   196.0  0.158024  0.084444   18    2    2    1    1  \n",
       "\n",
       "[3 rows x 45 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>origin</th>\n",
       "      <th>u1</th>\n",
       "      <th>u2</th>\n",
       "      <th>u3</th>\n",
       "      <th>u4</th>\n",
       "      <th>u5</th>\n",
       "      <th>u6</th>\n",
       "      <th>u7</th>\n",
       "      <th>u8</th>\n",
       "      <th>u9</th>\n",
       "      <th>u10</th>\n",
       "      <th>u11</th>\n",
       "      <th>...</th>\n",
       "      <th>m3</th>\n",
       "      <th>m4</th>\n",
       "      <th>m5</th>\n",
       "      <th>m6</th>\n",
       "      <th>m7</th>\n",
       "      <th>m8</th>\n",
       "      <th>m9</th>\n",
       "      <th>m10</th>\n",
       "      <th>m11</th>\n",
       "      <th>m12</th>\n",
       "      <th>um1</th>\n",
       "      <th>um2</th>\n",
       "      <th>um3</th>\n",
       "      <th>um4</th>\n",
       "      <th>um5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>308</td>\n",
       "      <td>20</td>\n",
       "      <td>5819</td>\n",
       "      <td>2</td>\n",
       "      <td>14870.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>410.0</td>\n",
       "      <td>961.0</td>\n",
       "      <td>0.027572</td>\n",
       "      <td>0.048387</td>\n",
       "      <td>39</td>\n",
       "      <td>9</td>\n",
       "      <td>20</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>1179</td>\n",
       "      <td>26</td>\n",
       "      <td>10931</td>\n",
       "      <td>2</td>\n",
       "      <td>72265.0</td>\n",
       "      <td>121.0</td>\n",
       "      <td>4780.0</td>\n",
       "      <td>2699.0</td>\n",
       "      <td>0.066145</td>\n",
       "      <td>0.053014</td>\n",
       "      <td>14</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>67</td>\n",
       "      <td>15</td>\n",
       "      <td>2281</td>\n",
       "      <td>2</td>\n",
       "      <td>6094.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>963.0</td>\n",
       "      <td>196.0</td>\n",
       "      <td>0.158024</td>\n",
       "      <td>0.084444</td>\n",
       "      <td>18</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 45 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 28
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:35:56.463128Z",
     "start_time": "2025-06-05T03:35:03.864905Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计点击、加购物车、购买、收藏的操作次数\n",
    "temp = groups['action_type'].value_counts().unstack() .reset_index().rename(columns={0:'um6', 1:'um7', 2:'um8', 3:'um9'})\n",
    "data = data.merge(temp,on =[\"merchant_id\",\"user_id\"],how = \"left\")\n",
    "data.head(3)"
   ],
   "id": "600e9aabf815d05",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   user_id  merchant_id  label origin   u1  u2   u3  u4   u5   u6     u7  u8  \\\n",
       "0    34176         3906    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "1    34176          121    0.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "2    34176         4356    1.0  train  451  47  256  45  109  108  410.0 NaN   \n",
       "\n",
       "     u9  u10       u11  ...       m7     m8      m9     m10       m11  \\\n",
       "0  34.0  7.0  0.082927  ...  14870.0   28.0   410.0   961.0  0.027572   \n",
       "1  34.0  7.0  0.082927  ...  72265.0  121.0  4780.0  2699.0  0.066145   \n",
       "2  34.0  7.0  0.082927  ...   6094.0   16.0   963.0   196.0  0.158024   \n",
       "\n",
       "        m12  um1  um2  um3  um4  um5   um6  um7  um8  um9  \n",
       "0  0.048387   39    9   20    6    1  36.0  NaN  1.0  2.0  \n",
       "1  0.053014   14    3    1    1    1  13.0  NaN  1.0  NaN  \n",
       "2  0.084444   18    2    2    1    1  12.0  NaN  6.0  NaN  \n",
       "\n",
       "[3 rows x 49 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>merchant_id</th>\n",
       "      <th>label</th>\n",
       "      <th>origin</th>\n",
       "      <th>u1</th>\n",
       "      <th>u2</th>\n",
       "      <th>u3</th>\n",
       "      <th>u4</th>\n",
       "      <th>u5</th>\n",
       "      <th>u6</th>\n",
       "      <th>u7</th>\n",
       "      <th>u8</th>\n",
       "      <th>u9</th>\n",
       "      <th>u10</th>\n",
       "      <th>u11</th>\n",
       "      <th>...</th>\n",
       "      <th>m7</th>\n",
       "      <th>m8</th>\n",
       "      <th>m9</th>\n",
       "      <th>m10</th>\n",
       "      <th>m11</th>\n",
       "      <th>m12</th>\n",
       "      <th>um1</th>\n",
       "      <th>um2</th>\n",
       "      <th>um3</th>\n",
       "      <th>um4</th>\n",
       "      <th>um5</th>\n",
       "      <th>um6</th>\n",
       "      <th>um7</th>\n",
       "      <th>um8</th>\n",
       "      <th>um9</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34176</td>\n",
       "      <td>3906</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>14870.0</td>\n",
       "      <td>28.0</td>\n",
       "      <td>410.0</td>\n",
       "      <td>961.0</td>\n",
       "      <td>0.027572</td>\n",
       "      <td>0.048387</td>\n",
       "      <td>39</td>\n",
       "      <td>9</td>\n",
       "      <td>20</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>36.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>34176</td>\n",
       "      <td>121</td>\n",
       "      <td>0.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>72265.0</td>\n",
       "      <td>121.0</td>\n",
       "      <td>4780.0</td>\n",
       "      <td>2699.0</td>\n",
       "      <td>0.066145</td>\n",
       "      <td>0.053014</td>\n",
       "      <td>14</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>13.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>34176</td>\n",
       "      <td>4356</td>\n",
       "      <td>1.0</td>\n",
       "      <td>train</td>\n",
       "      <td>451</td>\n",
       "      <td>47</td>\n",
       "      <td>256</td>\n",
       "      <td>45</td>\n",
       "      <td>109</td>\n",
       "      <td>108</td>\n",
       "      <td>410.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>34.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.082927</td>\n",
       "      <td>...</td>\n",
       "      <td>6094.0</td>\n",
       "      <td>16.0</td>\n",
       "      <td>963.0</td>\n",
       "      <td>196.0</td>\n",
       "      <td>0.158024</td>\n",
       "      <td>0.084444</td>\n",
       "      <td>18</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>12.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>6.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 49 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 29
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-05T03:48:38.392406Z",
     "start_time": "2025-06-05T03:48:15.567268Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 统计购买点击比\n",
    "data[\"um10\"] = data[\"um8\"]/data[\"um6\"]\n",
    "# 将提取好的特征保存，待下次读取\n",
    "data.to_csv(\"E:/练习/用户复购预测/用户复购率预测/数据工程和模型构建/features.csv\",index=False)"
   ],
   "id": "719e8f285bc19559",
   "outputs": [],
   "execution_count": 32
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
